package com.bosssoft.hr.train.j2se.util;

import com.bosssoft.hr.train.j2se.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.util.StringUtils;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
/**
 * @Classname: UtilsDemo
 * @Description:常用工具类作业
 * @author: zoubinyan
 * @Date: 2023/2/22
 */


@Slf4j
public class UtilsDemo {

    private  List<Integer> createList() {
        List<Integer> integerList=new ArrayList<>();
        // 初始化终止
        int c=10;
        Random random=new Random(1000);
        for(int i=0;i<c;i++){
            //生成100以内数字
            integerList.add(random.nextInt(100));
        }
        return integerList;
    }

    public  void method1(){
        // 创建测试数据
        List<Integer> integerList = createList();
        log.info(integerList.toString());
        /**
         * 通过例子我们了解集合类的sort方法，sort方法有诸多重载
         * 例如 Collections.sort(list,comparetor) 用于list内是对象需要依据对应的指定列比较
         * 的情况，这点和前面的作业TreeSet的排序输出相相似
         */
        Collections.sort(integerList);
        log.info(integerList.toString());

    }
        public void method2(){
            List<Integer> integerList=createList();
        /**
         *    null 或者没有内容都返回false ，通过该方法可以实现优雅的空判断
         *    替代 if(null==interlist || integerList.size==0) then return true
         */
            log.info(integerList.toString());
            log.info("测试结果isEmpty:"+integerList.isEmpty());
        /**
         * exist 判断 我们的集合langs中是否包含 Preicate指定的规则的数据如果包含返回true
         */
        /**
         * 将另外一个langs2的数组并入本集合中，方便数组合并用词替代for循环合并数组
         */
        Integer[] langs2 = {1,2,3};
        Collections.addAll(integerList, langs2);
            log.info(integerList.toString());
    }
        public void method3(){
        Integer[] score=new Integer[]{5,2,3,4,1};
        // 常用该方法把数组转化为列表
        List<Integer> scoreList=Arrays.asList(score);
            log.info(scoreList.toString());
        //数字排序 简单的支持 复杂的需要编写比较器 ,toArray 从列表转为数组
        Object[] scoreChange=scoreList.toArray();
        Arrays.sort(scoreChange);
        // 查找，使用二分查找加快速度
        Arrays.binarySearch(score,2);
        // 依次拷贝3个元素到数组
        Integer[] copyArray=Arrays.copyOf(score,3);
            log.info(Arrays.asList(copyArray).toString());

    }
        public void method4(){
        /**
         *  FileUitl 封装了 文件的各种操作，包括目录操作，文件操作（文件删除，文件内容读取，文件写入等）
         *  下面例子演示了遍历某一个指定目录下的所有的文件，第2个代表类型，第3个参数代表递归遍历
         *  在项目开发中经常碰到文件操作因此有必要熟悉该工具类
         */
        File file=new File("e:");
     File[]files=file.listFiles();
            log.info(Arrays.toString(files));
    }
        public void method5(){
        // 这个视为空
            log.info(String.valueOf(StringUtils.hasText("")));
            log.info(String.valueOf( StringUtils.hasText("1")));
  }

    public void method6() throws InvocationTargetException, IllegalAccessException {
        User user=new User();
        user.setCode("BS0001");
        user.setName("同学1");
        /**
         * 如果对象列的太多没有使用copy则要单个赋值代码太繁琐，项目中多处用到对象拷贝
        *   注意 如果对象内部包含对象和链表数组则只是拷贝应用，需要引入手动完成拷贝
         *   对象拷贝库众多，效率上有所差别，如果对象数量比较大可以考虑其他的库，如果量不大
         *   apache BeanUtil.copy可以满足
         * */
        User userCopy=new User();
        BeanUtils.copyProperties(user,userCopy);
        log.info(userCopy.toString());
    }
        public void method7() throws UnsupportedEncodingException {
        // MD5 加密  部分网站可以暴力破解

        String password="helloworld";
        byte[] bytePassword=password.getBytes("utf-8");
            log.info(Arrays.toString(bytePassword));
        DigestUtils.md5Hex(bytePassword);
    }

    public void method8() throws UnsupportedEncodingException {

        String password="helloworld";
        byte[] bytePassword=password.getBytes("utf-8");
        // SH3 加密 安全性更好不可逆
        DigestUtils.sha3_256(bytePassword);
    }

    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, UnsupportedEncodingException {
        new UtilsDemo().method1();

    }
}
